package cz.cvut.fel.y36pda.hs.masekji4.blanka.main;

import cz.cvut.fel.y36pda.hs.masekji4.blanka.screens.title.TitleScreen;
import cz.cvut.fel.y36pda.hs.masekji4.blanka.setting.MD5;
import cz.cvut.fel.y36pda.hs.masekji4.blanka.setting.Setting;
import net.rim.device.api.system.PersistentObject;
import net.rim.device.api.system.PersistentStore;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.container.MainScreen;

/**
 * Třída <code>Main</code> zajišťuje spuštění aplikace a obstarává čtení a zápis
 * nastavení do paměti telefonu.
 *
 * @author masekji4@fel.cvut.cz
 */
public class Main extends UiApplication {

    public static final int MAX_ERROR_COUNT = 3;

    private static Setting setting;
    private static PersistentObject store;
    private static int errorCounter = 0;

    /**
     * Spustí program.
     * 
     * @param args      parametry
     */
    public static void main(String[] args) {
        Main instance = new Main();
        instance.enterEventDispatcher();
    }

    /**
     * Vytvoří instanci třídy <code>Main</code>.
     */
    public Main() {
        initStore();
        loadSetting();

        MainScreen screen = new TitleScreen();
        pushScreen(screen);
    }

    /**
     * Inicializuje atribut <code>store</code> a umožní tak přístup k
     * perzistentnímu objektu s nastavením aplikace.
     */
    private static void initStore() {
        store = PersistentStore.getPersistentObject(0xb5bffb1b7d1b55cfL);
    }

    /**
     * Uloží nastavení aplikace do paměti telefonu.
     *
     * @param code      přístupový kód
     * @param number    telefonní číslo Jiřiny
     */
    public static void saveSetting(String code, String number) {
        synchronized (store) {
            setting.setCode(MD5.getHash(code));
            setting.setNumber(number);

            store.setContents(setting);
            store.commit();
        }
    }

    /**
     * Načte z paměti telefonu nastavení aplikace.
     */
    private static void loadSetting() {
        synchronized (store) {
            setting = (Setting) store.getContents();

            if (setting == null) {
                setting = new Setting();

                setting.setCode("81dc9bdb52d04dc20036dbd8313ed055");
                setting.setNumber("+420736837542");
            }
        }
    }
    
    /**
     * Ověří platnost zadaného přístupového kódu.
     *
     * @param code  testovaný přístupový kód
     * @return      <code>true</code>, shoduje-li se zadaný přístupový kód
     *              s nastaveným
     */
    public static boolean isRight(String code) {
        return setting.getCode().compareTo(MD5.getHash(code)) == 0;
    }

    /**
     * Vrátí telefonní číslo osoby kontaktované po x špatných zadáních
     * přístupového kódu.
     *
     * @return  telefonní číslo
     */
    public static String getNumber() {
        return setting.getNumber();
    }

    /**
     * Inkrementuje počítadlo chybných zadání přístupového kódu o 1 a vrátí
     * <code>true</code>, dosáhne-li hodnoty <code>MAX_ERROR_COUNT</code>.
     *
     * @return  <code>true</code>, je-li hodnota počítadla &gt;= <code>MAX_ERROR_COUNT</code>
     */
    public static boolean incErrorCounter() {
        errorCounter++;

        return errorCounter < MAX_ERROR_COUNT;
    }

    /**
     * Vynuluje počítadlo chybných zadání přístupového kódu.
     */
    public static void clerErrorCounter() {
        errorCounter = 0;
    }
}
